/* Copyright (c) 2008, RPI-ACM, Jesse Kempf <jessekempf@gmail.com> 
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 * - Redistributions of source code must retain the above copyright notice,
 *   this list of conditions and the following disclaimer.
 * - Redistributions in binary form must reproduce the above copyright notice,
 *   this list of conditions and the following disclaimer in the documentation
 *   and/or other materials provided with the distribution.
 * - Neither the name of RPI-ACM nor the names of its contributors may
 *   be used to endorse or promote products derived from this software without
 *   specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

#include <Python.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <grp.h>
#include <pwd.h>
#include <utime.h>

static PyObject *unixutils_fchmod(PyObject *self, PyObject *args);
static PyObject *unixutils_fchown(PyObject *self, PyObject *args);

PyDoc_STRVAR(fchmod_doc, "fchmod(fd, mode)\n"
"\n"
"Sets the mode of the file referenced by fd to the mode specified.\n"
"\n"
"See the fchmod(2) manpage for more details.");

static PyObject *unixutils_fchmod(PyObject *self, PyObject *args) {
	int fd;
	int mode;

	if (!PyArg_ParseTuple(args, "ii", &fd, &mode))
		return (NULL);


	if (fchmod(fd, (mode_t)mode) == -1) {
		PyErr_SetFromErrno(PyExc_OSError);
		return (NULL);
	}
	Py_RETURN_NONE;
}

PyDoc_STRVAR(fchown_doc, "fchown(fd, uid, gid)\n"
"\n"
"Sets the ownership of the file referenced by fd to the provided\n"
"uid and gid.\n"
"\n"
"See the fchown(2) manpage for more details.");

static PyObject *unixutils_fchown(PyObject *self, PyObject *args) {
	int fd;
	int uid;
	int gid;

	if (!PyArg_ParseTuple(args, "iii", &fd, &uid, &gid))
		return (NULL);

	if (fchown(fd, (uid_t)uid, (gid_t)gid) == -1) {
		PyErr_SetFromErrno(PyExc_OSError);
		return (NULL);
	}
	Py_RETURN_NONE;
}

static PyMethodDef unixutils_fdextrasMethods[] = {
	{"fchmod", unixutils_fchmod, METH_VARARGS, fchmod_doc},
	{"fchown", unixutils_fchown, METH_VARARGS, fchown_doc},
	{NULL, NULL, 0, NULL}
};

PyMODINIT_FUNC initfdextras(void) {
	(void) Py_InitModule("fdextras", unixutils_fdextrasMethods);
}
